/*****************************************************************************/
/*                                                                           */
/*    Domino Operation System Driver Module                                  */
/*                                                                           */
/*    Copyright (C) 2007 Laszlo Arvai                                        */
/*                                                                           */
/*    ------------------------------------------------------------------     */
/*    drvIRRCTransmitter - Driver for Infra Red Remote Control transmitter   */
/*****************************************************************************/

///////////////////////////////////////////////////////////////////////////////
// Includes
#include <drvIRRCTransmitter.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "drvIOConfig.h"

///////////////////////////////////////////////////////////////////////////////
// Initialize
void drvIRRCTXInit(void)
{
	// init output pin
	InitIRRCTX();

	// setup timer1
	TIMSK = _BV(OCIE1A);
	TCCR1A = 0;
	TCCR1B = _BV(CS11);

	// setup timer2
	TCCR2 = _BV(WGM21) | _BV(COM20);
}

///////////////////////////////////////////////////////////////////////////////
// Set time for timer callback
void drvIRRCTXSetTimerCallback( dosWord in_time )
{
	OCR1A = in_time;
}

///////////////////////////////////////////////////////////////////////////////
// Set time for timer callback
void drvIRRCTXAddTimerCallback( dosWord in_time )
{
	OCR1A = OCR1A + in_time;
}

///////////////////////////////////////////////////////////////////////////////
// Compare match interrupt
ISR(TIMER1_COMPA_vect)
{
	comIRRCTXTimerCallback();
}

///////////////////////////////////////////////////////////////////////////////
// Setup Pulse Generator
void drvIRRCTXSetupPulseGenerator( dosByte in_frequency, dosByte in_duty_cycle )
{
	// setup frequency
	OCR2 = F_CPU / 1000 / in_frequency; // in_frequency must be in kHz

	// duty cycle is not supported
}

///////////////////////////////////////////////////////////////////////////////
// Start pulse generation
void drvIRRCTXStartPulseGenerator(void)
{
	// reset counter
	TCNT2 = 0;

	// start pulse generator
	IRRCTXStartPulseGenerator();
}

///////////////////////////////////////////////////////////////////////////////
// Stop pulse generator
void drvIRRCTXStopPulseGenerator(void)
{
	// wait if output is active
	while( IRRCTXIsSet() );

	// stop timer
	TCCR2 &= ~( _BV(CS22) | _BV(CS21) | _BV(CS20) );

	// check if output is active
	if( IRRCTXIsSet() )
		TCCR2 |= _BV(FOC2);	// toggle output
}
